package br.sc.senai.util;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import javax.swing.JOptionPane;

import br.sc.senai.conexaoBanco.ConexaoMySQL;

public class GeradorDeSQL {
	private static final int CLIENTE = 0;
	private static final int CLIENTE_FISICO = 0;
	private static final int CLIENTE_JURIDICO = 1;
	private static final int FUNCIONARIO = 1;
	private static final int VENDA = 2;
	private static final int PRODUTO = 3;
	private static final int ENTRADA = 4;
	private static final int SAIR = 5;
	private static final int GMAIL = 0;
	private static final int YAHOO = 1;
	private static final int HOTMAIL = 2;
	private static final int OUTLOOK = 3;
	static Random rand = new Random();

	public static void main(String[] args) {
		String[] s = { "Cliente", "Funcionário", "Venda", "Produto", "Entrada",
				"Sair" };
		int tipo = -1;
		int quantidade = 0;

		while (tipo == -1) {
			tipo = JOptionPane.showOptionDialog(null,
					"Informe o que deseja inserir: ", "Atenção", 1, 1, null, s,
					"Cliente");
		}
		if (tipo != SAIR) {
			try {
				quantidade = Integer.parseInt(JOptionPane
						.showInputDialog("Quantidade a inserir? "));
			} catch (NumberFormatException e) {
				JOptionPane.showMessageDialog(null, "Informe apenas números. ");
			}
		}
		switch (tipo) {
		case CLIENTE:
			String[] sCliente = { "Cliente Físico", "Cliente Jurídico" };
			int tipoCliente = -1;
			while (tipoCliente == -1) {
				tipoCliente = JOptionPane.showOptionDialog(null,
						"Informe o tipo de cliente: ", "Atenção", 1, 1, null,
						sCliente, "Cliente Físico");
			}

			switch (tipoCliente) {
			case CLIENTE_FISICO:
				gerarClientesFisicos(quantidade);

				break;

			case CLIENTE_JURIDICO:
				gerarClientesJuridicos(quantidade);

				break;
			}

			break;

		case FUNCIONARIO:
			gerarFuncionarios(quantidade);

			break;

		case VENDA:
			try {
				gerarVendas(quantidade);
			} catch (SQLException e) {
				System.out.println("Nenhum produto cadastrado. ");
			}

			break;

		case PRODUTO:
			gerarProdutos(quantidade);

			break;

		case ENTRADA:
			try {
				gerarEntradas(quantidade);
			} catch (SQLException e) {
				System.out.println("Nenhum produto cadastrado. ");
			}

			break;
		}
	}

	private static void gerarClientesFisicos(int quantidade) {
		String s = "";
		for (int i = 0; i < quantidade; i++) {
			String nome = JOptionPane.showInputDialog("Informe um nome: ");
			s += "INSERT INTO cliente (nome, cpf, telefone, email, endereco, cidade, cep, dataCadastro)\nVALUES ('"
					+ nome
					+ "', '"
					+ randomCPF()
					+ "', '"
					+ randomTelefone()
					+ "', '"
					+ randomEmail(nome)
					+ "', '"
					+ JOptionPane.showInputDialog("Informe um endereço: ")
					+ "', '"
					+ JOptionPane.showInputDialog("Informe uma cidade: ")
					+ "', '"
					+ randomCEP()
					+ "', '"
					+ new SimpleDateFormat("yyyy-MM-dd").format(new Date())
					+ "');";
			s += "\n";
		}

		System.out.println(s);
	}

	private static void gerarClientesJuridicos(int quantidade) {
		String s = "";
		for (int i = 0; i < quantidade; i++) {
			String nome = JOptionPane.showInputDialog("Informe um nome: ");
			s += "INSERT INTO cliente (nome, cnpj, telefone, email, endereco, cidade, cep, dataCadastro)\nVALUES ('"
					+ nome
					+ "', '"
					+ randomCNPJ()
					+ "', '"
					+ randomTelefone()
					+ "', '"
					+ randomEmail(nome)
					+ "', '"
					+ JOptionPane.showInputDialog("Informe um endereço: ")
					+ "', '"
					+ JOptionPane.showInputDialog("Informe uma cidade: ")
					+ "', '"
					+ randomCEP()
					+ "', '"
					+ new SimpleDateFormat("yyyy-MM-dd").format(new Date())
					+ "');";
			s += "\n";
		}

		System.out.println(s);
	}

	private static void gerarFuncionarios(int quantidade) {
		String s = "";
		for (int i = 0; i < quantidade; i++) {
			String nome = JOptionPane.showInputDialog("Informe um nome: ");
			s += "INSERT INTO funcionario (nome, cpf, telefone, email, endereco, cidade, cep, dataCadastro)\nVALUES ('"
					+ nome
					+ "', '"
					+ randomCPF()
					+ "', '"
					+ randomTelefone()
					+ "', '"
					+ randomEmail(nome)
					+ "', '"
					+ JOptionPane.showInputDialog("Informe um endereço: ")
					+ "', '"
					+ JOptionPane.showInputDialog("Informe uma cidade: ")
					+ "', '"
					+ randomCEP()
					+ "', '"
					+ new SimpleDateFormat("yyyy-MM-dd").format(new Date())
					+ "');";
			s += "\n";
		}

		System.out.println(s);
	}

	private static void gerarVendas(int quantidade) throws SQLException {
		String s = "";
		Date data = new Date();
		String idsClientes = "{";
		String idsFuncionarios = "{";
		Statement st = ConexaoMySQL.getConexaoMySQL().createStatement();

		ResultSet rsClientes = st
				.executeQuery("SELECT idCliente FROM cliente;");

		while (rsClientes.next()) {
			idsClientes += rsClientes.getInt("idCliente");

			if (rsClientes.isLast()) {
				idsClientes += "}";
			} else {
				idsClientes += ", ";
			}
		}
		
		ResultSet rsFuncionarios = st
				.executeQuery("SELECT idFuncionario FROM funcionario;");

		while (rsFuncionarios.next()) {
			idsFuncionarios += rsFuncionarios.getInt("idFuncionario");

			if (rsFuncionarios.isLast()) {
				idsFuncionarios += "}";
			} else {
				idsFuncionarios += ", ";
			}
		}
		for (int i = 0; i < quantidade; i++) {
			

			String ins = "INSERT INTO venda (idCliente, idFuncionario, data)\nVALUES ("
					+ JOptionPane.showInputDialog("Informe o ID do Cliente:\n"
							+ idsClientes)
					+ ", "
					+ JOptionPane
							.showInputDialog("Informe o ID do Funcionario:\n"
									+ idsFuncionarios)
					+ ", '"
					+ new SimpleDateFormat("yyyy-MM-dd").format(data)
					+ "');";
			st.executeUpdate(ins);
			
			s += ins + "\n";
		}

		System.out.println(s);
	}

	private static void gerarProdutos(int quantidade) {
		String s = "";
		for (int i = 0; i < quantidade; i++) {
			s += "INSERT INTO produto (marca, descricao, precoUnitario, validade)\nVALUES ('"
					+ JOptionPane.showInputDialog("Informe uma marca: ")
					+ "', '"
					+ JOptionPane.showInputDialog("Informe uma descrição: ")
					+ "', "
					+ JOptionPane
							.showInputDialog("Informe um preço unitário: ")
					+ ", "
					+ JOptionPane
							.showInputDialog("Informe uma validade (em meses): ")
					+ ");";
			s += "\n";
		}

		System.out.println(s);
	}

	private static void gerarEntradas(int quantidade) throws SQLException {
		String s = "";
		Date data = new Date();
		String ids = "{";
		Statement st = ConexaoMySQL.getConexaoMySQL().createStatement();
		String query = "SELECT idProduto FROM produto;";
		ResultSet rs = st.executeQuery(query);

		while (rs.next()) {
			ids += rs.getInt("idProduto");

			if (rs.isLast()) {
				ids += "}";
			} else {
				ids += ", ";
			}
		}
		for (int i = 0; i < quantidade; i++) {
			
			s += "INSERT INTO entrada (idProduto, data, hora, quantidade)\nVALUES ("
					+ JOptionPane.showInputDialog("Informe o ID do produto:\n"
							+ ids)
					+ ", '"
					+ new SimpleDateFormat("yyyy-MM-dd").format(data)
					+ "', '"
					+ new SimpleDateFormat("HH:mm:ss").format(data)
					+ "', "
					+ JOptionPane.showInputDialog("Informe uma quantidade: ")
					+ ");";
			s += "\n";
		}

		System.out.println(s);
	}

	private static String randomCPF() {
		// 932.204.392-23
		return rand.nextInt(1000) + "." + rand.nextInt(1000) + "."
				+ rand.nextInt(1000) + "-" + rand.nextInt(100);
	}

	private static String randomCNPJ() {
		// 08.385.069/0001-92
		// 0001 nunca muda
		return rand.nextInt(100) + "." + rand.nextInt(1000) + "."
				+ rand.nextInt(1000) + "/0001-" + rand.nextInt(100);
	}

	private static String randomTelefone() {
		// (48) 8533-7543
		return "(" + rand.nextInt(100) + ") " + rand.nextInt(10000) + "-"
				+ rand.nextInt(10000);
	}

	private static String randomEmail(String nome) {
		// igorcampos7@gmail.com
		int tipoEmail = rand.nextInt(4);
		String tipo = "";

		switch (tipoEmail) {
		case GMAIL:
			tipo = "@gmail.com";

			break;

		case YAHOO:
			tipo = "@yahoo.com.br";

			break;

		case HOTMAIL:
			tipo = "@hotmail.com";

			break;

		case OUTLOOK:
			tipo = "@outlook.com.br";

			break;
		}

		return trim(nome).toLowerCase() + tipo;
	}

	private static String randomCEP() {
		// 88050-130
		return rand.nextInt(100000) + "-" + rand.nextInt(1000);
	}

	private static String trim(String s) {
		String rs = "";
		for (int i = 0; i < s.length(); i++)
			if (!s.substring(i, i + 1).equals(" "))
				rs += s.substring(i, i + 1);
		return rs;
	}
}
